package models

import (
	"gorm.io/gorm"
	"order_srv/basic/config"
	"time"
)

// 订单
type Orders struct {
	Id               uint32    `gorm:"column:id;type:int UNSIGNED;comment:主键id;primaryKey;not null;" json:"id"`                                                            // 主键id
	OrderSn          string    `gorm:"column:order_sn;type:varchar(50);comment:订单编号;not null;" json:"order_sn"`                                                            // 订单编号
	OrderType        int8      `gorm:"column:order_type;type:tinyint(1);comment:订单类型 1-实时单 2-预约单 3-接机单 4-送机单;not null;default:1;" json:"order_type"`                       // 订单类型 1-实时单 2-预约单 3-接机单 4-送机单
	UserId           uint32    `gorm:"column:user_id;type:int UNSIGNED;comment:用户id;not null;" json:"user_id"`                                                             // 用户id
	DriverId         uint32    `gorm:"column:driver_id;type:int UNSIGNED;comment:司机id;not null;" json:"driver_id"`                                                         // 司机id
	CityId           uint32    `gorm:"column:city_id;type:int UNSIGNED;comment:所在城市;not null;" json:"city_id"`                                                             // 所在城市
	Price            float64   `gorm:"column:price;type:decimal(10, 2);comment:最终价格;not null;" json:"price"`                                                               // 最终价格
	CarTypeId        int8      `gorm:"column:car_type_id;type:tinyint;comment:车型 1-舒适型 2-豪华型 3-快车 4-拼车;not null;" json:"car_type_id"`                                      // 车型 1-舒适型 2-豪华型 3-快车 4-拼车
	StartLoc         string    `gorm:"column:start_loc;type:varchar(50);comment:起点;not null;" json:"start_loc"`                                                            // 起点
	EndLoc           string    `gorm:"column:end_loc;type:varchar(50);comment:目的地;not null;" json:"end_loc"`                                                               // 目的地
	PayWay           int8      `gorm:"column:pay_way;type:tinyint(1);comment:支付方式 1-支付宝 2-微信;default:1;" json:"pay_way"`                                                   // 支付方式 1-支付宝 2-微信
	Distance         float64   `gorm:"column:distance;type:decimal(10, 2);comment:距离;not null;" json:"distance"`                                                           // 距离
	OrderStatus      int8      `gorm:"column:order_status;type:tinyint(1);comment:订单状态 1-待接单 2-待上车 3-行驶中 4-待支付 5-已完成 6-已取消 7-已退款;not null;default:1;" json:"order_status"` // 订单状态 1-待接单 2-待上车 3-行驶中 4-待支付 5-已完成 6-已取消 7-已退款
	DriverDepartTime time.Time `gorm:"column:driver_depart_time;type:datetime;comment:出发时间;default:NULL;" json:"driver_depart_time"`                                       // 出发时间
	DriverArriveTime time.Time `gorm:"column:driver_arrive_time;type:datetime;comment:到达时间;default:NULL;" json:"driver_arrive_time"`                                       // 到达时间
	ServiceStartTime time.Time `gorm:"column:service_start_time;type:datetime;comment:服务开始时间;default:NULL;" json:"service_start_time"`                                     // 服务开始时间
	ServiceEndTime   time.Time `gorm:"column:service_end_time;type:datetime;comment:服务结束时间;default:NULL;" json:"service_end_time"`                                         // 服务结束时间
	PayTime          time.Time `gorm:"column:pay_time;type:datetime;comment:支付完成时间;default:NULL;" json:"pay_time"`                                                         // 支付完成时间
	CancelTime       time.Time `gorm:"column:cancel_time;type:datetime;comment:取消时间;default:NULL;" json:"cancel_time"`                                                     // 取消时间
	CreateAt         time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;" json:"create_at"`
	UpdateAt         time.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;" json:"update_at"`
	DeleteAt         time.Time `gorm:"column:delete_at;type:datetime;default:NULL;" json:"delete_at"`
	// 特殊需求
	NeedBabySeat      bool   `gorm:"column:need_baby_seat;type:tinyint(1);comment:需要婴儿座椅;default:0;" json:"need_baby_seat"`
	AllowPets         bool   `gorm:"column:allow_pets;type:tinyint(1);comment:允许携带宠物;default:0;" json:"allow_pets"`
	OtherRequirements string `gorm:"column:other_requirements;type:varchar(255);comment:其他特殊需求;default:'';" json:"other_requirements"`
	// 派单与审计
	Source string `gorm:"column:source;type:varchar(32);comment:来源;not null;default:'app';index:idx_src_status_ctime_plate,priority:1" json:"source"`
}

func (o *Orders) TableName() string {
	return "orders"
}

// 获取订单Id
func (o *Orders) GetOrderId() error {
	return config.DB.First(&o).Error
}

// 创建订单
func (o *Orders) CreateOrders() error {
	return config.DB.Create(&o).Error
}

// 更新订单
func (o *Orders) UpdateOrders() error {
	return config.DB.Updates(&o).Error
}

// 修改订单状态
func (o *Orders) UpdateOrderStatus() error {
	return config.DB.Model(&Orders{}).Where("id = ?", o.Id).Updates(&o).Error
}

// 修改订单服务开始时间
func (o *Orders) UpdateOrderServiceStartTime() error {
	return config.DB.Model(&Orders{}).Where("id = ?", o.Id).Update("service_start_time", o.ServiceStartTime).Error
}

// 用户订单列表
func (o *Orders) GetOrderList(UserId uint32) (list []*Orders, err error) {
	err = config.DB.Model(&Orders{}).Where("user_id", UserId).Find(&list).Error
	return
}

// 获取取消订单列表
func (o *Orders) GetCancelList() (list []CancelOrderList, err error) {

	query := config.DB.Debug().Model(&Orders{}).Select("`orders`.`order_sn`, `orders`.`user_id`, `orders`.`driver_id`, `order_cancellation`.`reason`, " +
		"`order_cancellation`.`cancellation_fee`, `order_cancellation`.`liability`, `order_cancellation`.`identity`, `order_cancellation`.`order_id`," +
		" `user`.`nick_name`, `user`.`mobile`, `user`.`real_name`, `driver`.`mobile` as driver_mobile, `driver`.`real_name` as driver_real_name").
		Joins("join order_cancellation on order_cancellation.order_id = orders.id").
		Joins("join user on user.id = orders.user_id").
		Joins("join user as driver on driver.id = orders.driver_id").
		Where("orders.order_status = 6")
	if o.UserId != 0 {
		query = query.Where("orders.user_id = ?", o.UserId)
	}
	err = query.Find(&list).Error
	return
}

// 取消订单列表
type CancelOrderList struct {
	OrderId         uint64  ` json:"order_id"`
	OrderSn         string  ` json:"order_sn"`
	Mobile          string  `json:"mobile"`
	RealName        string  `json:"real_name"`
	DriverMobile    string  ` json:"driver_mobile"`
	DriverRealName  string  ` json:"driver_real_name"`
	DriverId        uint32  ` json:"driver_id"`
	Reason          string  ` json:"reason"`
	Liability       uint8   ` json:"liability"`
	CancellationFee float64 ` json:"cancellation_fee"`
	Identity        int8    ` json:"identity"`
}

// 订单详情
func (o *Orders) GetOrderInfo(Id int) error {
	return config.DB.Model(&o).Where("id = ?", Id).Limit(1).Find(&o).Error
}

// 订单类型筛选
func (o *Orders) GetOrderTypeList(page, pageSize int) (list []*Orders, err error) {
	err = config.DB.Model(&Orders{}).Where("order_type = ?", o.OrderType).Scopes(Paginate(page, pageSize)).Find(&list).Error
	return
}

func (o *Orders) UpdateOrderPrice(Id int) error {
	return config.DB.Model(&o).Where("id = ?", Id).Update("price", o.Price).Error
}

// 获取订单用户支付状态
func (o *Orders) GetOrderUserPayStatus() error {
	return config.DB.Model(&Orders{}).Where("user_id = ?", o.UserId).Limit(1).Find(&o).Error
}

func (o *Orders) UpdateOrderDriverId(Id int) error {
	return config.DB.Model(&o).Where("id = ?", Id).Update("driver_id", o.DriverId).Error
}

// 支付宝回调
func (o *Orders) OrderPaymentCallback(OrderSn string) error {
	return config.DB.Model(&o).Where("order_sn = ?", OrderSn).Updates(&o).Error
}

func (o *Orders) Create(tx *gorm.DB) error {
	return tx.Create(&o).Error
}
